const userInfo = uni.getStorageSync('userInfo'); // 获取本地存储的userInfo
const userId = userInfo ? userInfo.id : null; // 获取userId
const socketUrl = `ws://localhost:5000/cloudBusiness/ws/message/${userId}`; // 使用userId拼接socketUrl

// 如果没有获取到userId，提示“登录后才能使用”
if (!userId) {
	uni.showToast({
		title: '登录后才能使用',
		icon: 'none',
		duration: 2000
	});
}
// 重试最大次数, 避免出现网络错误停留在页面 出现无限socket重连导致 浏览器卡死
const retryMaxTimes = 10

let retryTimes = 1

class WebSocketClass {

	constructor() {
		this.lockReconnect = false; // 是否开始重连
		this.wsUrl = socketUrl; // ws 地址
		// this.globalCallback = this.globalCallback(); // 回调方法
		this.userClose = false; // 是否主动关闭
		this.createWebSocket(socketUrl);
	}


	createWebSocket(url) {
		this.wsUrl = url;
		try {
			// 创建一个this.ws对象【发送、接收、关闭socket都由这个对象操作】

			this.ws = uni.connectSocket({
				url: this.wsUrl,
				success: (data) => {
					console.log("websocket连接成功");
					this.initEventHandle();
				},
			});
			console.log("websocket连接中...",this.ws);

		} catch (e) {
			this.reconnect(url);
		}
	}

	// 初始化
	initEventHandle() {

		/**
		 * 监听WebSocket连接打开成功
		 */

		this.ws.onOpen(res => {
			console.log('WebSocket连接打开');
		});

		/**
		 * 连接关闭后的回调函数
		 */

		this.ws.onClose(() => {
			if (!this.userClose) {
				this.reconnect(this.wsUrl); //重连
			}
		});


		/**
		 * 报错时的回调函数
		 */

		this.ws.onError(() => {
			if (!this.userClose) {
				this.reconnect(this.wsUrl); //重连
			}
		});


		/**
		 * 收到服务器数据后的回调函数
		 */
		this.ws.onMessage(event => {
			if (this.isJSON(event.data)) {
				const jsonobject = JSON.parse(event.data)
				this.globalCallback(jsonobject)
			} else {
				this.globalCallback(event.data)
			}
		});
	}

	// 重连
	reconnect(url) {

		if (this.lockReconnect) return;
		this.ws.close();
		this.lockReconnect = true; // 关闭重连，没连接上会一直重连，设置延迟避免请求过多
		if (retryTimes < retryMaxTimes) {
			retryTimes = retryTimes + 1
			console.info('WebSocket当前重试次数', retryTimes)
			setTimeout(() => {
				this.createWebSocket(url);
				this.lockReconnect = false;
			}, 1000);
		}else{
			console.info('WebSocket当前已经重试最大次数，依旧无法连接，不在重试，请检查网络是否正常')
		}

	}

	// 发送信息方法:使用方法：在需要用到的地方   this.$ws.sendMsg(data),data可用下面的方法packMsg
	sendMsg(data) {
		this.ws.send(JSON.stringify(data));
	}
	
	  // 发送信息方法
	  sendMsg(data) {
	    if (this.ws) {
	      this.ws.send({
	        data: JSON.stringify(data),
	        success: () => {
	          console.log("消息发送成功");
	        },
	        fail: (err) => {
	          console.error("消息发送失败", err);
	        }
	      });
	    } else {
	      console.error("WebSocket实例未初始化，无法发送消息");
	    }
	  }

	// 获取ws返回的数据方法 使用方法：this.$ws.getMsg((res) => {
			// 	console.info('接收消息', res)
			// })
	getMsg(callback) {
		this.globalCallback = callback
	}

	globalCallback(data) {
		return new Promise((resolve, reject) => {
			resolve(data); // 成功时调用resolve
		});
	}

	// 关闭ws方法
	closeSocket() {
		if (this.ws) {
			this.userClose = true;
			this.ws.close({
				success(res) {
					console.log("关闭成功", res)
				},
				fail(err) {
					console.log("关闭失败", err)
				}
			});
		}
	}

	writeToScreen(massage) {
		console.log(massage);
	}

	isJSON(str) {
		if (typeof str == 'string') {
			try {
				var obj = JSON.parse(str);
				if (typeof obj == 'object' && obj) {
					return true;
				} else {
					return false;
				}

			} catch (e) {
				// console.log('error：'+str+'!!!'+e);
				return false;
			}
		}
		// console.log('It is not a string!')
	}

	  // 构建消息结构体
	  packMsg(id, name, type, time, icon, msg, header = null, isRead = 0) {
	    return {
	      id: id,
	      name: name,
	      type: type,
	      time: time,
	      icon: icon || this.defaultImg, // 如果 icon 为空，则使用默认头像
	      msg: msg,
	      header: header,
	      isRead: isRead,
	    };
	  }
}
export default WebSocketClass;